from typing import Optional

from pydantic import BaseModel, ConfigDict
from pydantic.types import UUID4

from app.schemas.archivable import Archivable


class ItemBase(BaseModel):
    '''
    这是一个基类，包含 name 和 description 属性。
    这些属性是可选的，因为它们可能为空。
    '''
    name: Optional[str] = "New Item"
    description: Optional[str] = "A great description for a great item"


class ItemCreate(ItemBase):
    '''
    这是一个创建Item对象的schema，继承自ItemBase。
    这个schema包含ItemBase中的所有属性.
    '''
    pass


class ItemUpdate(ItemBase):
    '''
    这是一个更新Item对象的schema，继承自ItemBase。
    这个schema包含ItemBase中的所有属性.
    '''
    pass


class ItemInDBBase(ItemBase):
    '''
    这是一个存储在数据库中的 Item 对象的基类，继承自ItemBase。
    这个类还包含一个 id 属性，这是数据库中唯一的标识符。
    '''
    # 这行代码的作用是配置ItemInDBBase类的model_config属性，以便将类的属性直接映射到实例的属性。
    model_config = ConfigDict(from_attributes=True)

    id: UUID4


class Item(ItemInDBBase):
    '''
    这是一个返回给客户端的 Item 对象，继承自ItemInDBBase。
    这个类包含所有 ItemInDBBase 中的属性。
    '''
    pass


class ItemInDB(ItemInDBBase, Archivable):
    '''
    这是一个存储在数据库中的 Item 对象，继承自ItemInDBBase和 Archivable。
    这个类包含所有 ItemInDBBase 中的属性，以及 Archivable 类中的 archived 属性。
    user_id 属性是可选的，因为Item可能没有关联的用户。
    '''
    user_id: Optional[UUID4] = None
